/*
 * Copyright 2013 Robert Peszek.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package fpig.groovylists.functions

import fpig.lists.functions.Base
import static fpig.lists.functions.InAndOutOfF.withFunList
import fpig.util.CallUtil

/**
 * Basic Functional list functions adopted to Groovy
 *
 * http://code.google.com/p/fpiglet/
 * @author Robert Peszek
 */
class FunBaseForGroovy {

	static Closure foldL = CallUtil.toFunction {Closure foldF, acc, List l-> withFunList(Base.foldL(foldF, acc)) << l }
	
	static Closure reduceL = CallUtil.toFunction {Closure foldF, List l-> withFunList(Base.reduceL(foldF)) << l}

	static Closure foldR = CallUtil.toFunction {Closure foldF, acc, List l-> withFunList(Base.foldR(foldF, acc)) << l }
	
	static Closure reduceR = CallUtil.toFunction {Closure foldF, List l-> withFunList(Base.reduceR(foldF)) << l}

	static Closure filter = CallUtil.toFunction {Closure predicate,  List l -> withFunList(Base.filter(predicate)) << l}

	static Closure map = CallUtil.toFunction {Closure expr, List l -> withFunList(Base.map(expr)) << l}

	static Closure reverse = withFunList(Base.reverse)
}
